package com.li.onjava8.concurrent.es;

import com.li.onjava8.concurrent.es.task.CountingTask;

import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

/**
 * @author li
 * @date 2023/10/30 14:31
 */
public class CachedThreadPool3 {

    public static Integer extractResult(Future<Integer> f) {
        try {
            //
            return f.get();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        ExecutorService es = Executors.newCachedThreadPool();
        List<CountingTask> tasks = IntStream.range(0, 10)
                .mapToObj(CountingTask::new)
                .collect(Collectors.toList());
        //只有在所有任务完成后，invokeAll()才会返回一个Future列表，每个任务一个Future。
        List<Future<Integer>> futures = es.invokeAll(tasks);
        //但这意味着，Future似乎是多余的，因为invokeAll()直到所有任务完成之前都不会返回。
        //但是这里的Future并不用于延迟结果，而是用于捕获任何可能发生的异常。
        Integer result = futures.stream()
                .map(CachedThreadPool3::extractResult)
                .reduce(0, Integer::sum);
        System.out.println(result);
        es.shutdown();
    }
}
